package com.yaolonga.dc.core.spi;

import com.yaolonga.dc.core.*;
import com.yaolonga.dc.core.model.SearchModel;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

import java.util.List;

/**
 * @author yaolong
 * @version V1.0.0
 * @program dynamic-condition
 * @description 节点执行器接口
 * @create 2024-06-01 22:14
 **/
public interface NodeExecutor<R> {

    /**
     * @return 节点解析器
     */
    NodeParser<R> nodeParser();

    /**
     * list 节点执行 （同步）
     *
     * @param astNode 节点
     * @param bean    实体bean
     * @param <T>
     * @return
     */
    <T> List<T> execute(List<GroupNode> astNode, Class<T> bean);
    /**
     * list 节点执行 （异步）
     *
     * @param astNode 节点
     * @param bean    实体bean
     * @param <T>
     * @return
     */
   default  <T> Flux<T> executeAsync(List<GroupNode> astNode, Class<T> bean){
       return Flux.fromIterable(execute(astNode,bean));
   };

    /**
     * 分页节点执行 （同步）
     *
     * @param page
     * @param pageSize
     * @param astNode
     * @param bean
     * @param <T>
     * @return
     */
    <T> DCPage<T> executePage(int page, int pageSize, List<GroupNode> astNode, Class<T> bean);
    /**
     * 分页节点执行 （异步）
     *
     * @param page
     * @param pageSize
     * @param astNode
     * @param bean
     * @param <T>
     * @return
     */
    default  <T> Mono<DCPage<T>> executePageAsync(int page, int pageSize, List<GroupNode> astNode, Class<T> bean) {
        return Mono.just(executePage(page, pageSize, astNode, bean));
    };

    default <T> Mono<DCPage<T>> executePageAsync(SearchModel searchModel, Class<T> bean) {
        return executePageAsync(searchModel.getPage(), searchModel.getPageSize(), searchModel.getAst(), bean);
    }

    default <T> DCPage<T> executePage(SearchModel searchModel, Class<T> bean) {
        return executePage(searchModel.getPage(), searchModel.getPageSize(), searchModel.getAst(), bean);
    }

    ;

    /**
     * @return 执行器类型
     */
    ExecutorType getExecutorType();
}

